package com.hqyj.paimaisys.web;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

//订阅某一个拍品的最新价格

@Component
@ServerEndpoint("/newprice/{aid}")
public class SendPriceWebsocket {

    //关注同一拍品的Session应该在一组
    //map 要线程安全
    static Map<Integer, List<Session>> map = new ConcurrentHashMap<Integer, List<Session>>();

    //Session 指客户端和服务端的会话对象
    @OnOpen
    public void open(@PathParam("aid") Integer aid, Session session) throws IOException {
        //只要打开拍品详细信息页面，就把相关session放到 map中。
        //如果是关注该拍品的第一个人, 先新建Session的集合
        List<Session> value = map.get(aid);

        if(value == null) {
            value = new ArrayList<Session>();
            map.put(aid, value);
        }
        //集合中增加当前的session
        value.add(session);
    }

    @OnError
    public void error(Throwable e, Session session){
        if(!session.isOpen()){
            //先查询session关注了哪个拍品
            map.forEach((key,value)->{
                if(value.contains(session)){
                    value.remove(session);
                };
            });
        }
        System.out.println(" 出异常了 ");
    }

    //如果客户端的页面关闭， 拍品有了最新价格， 也不给这个客户端发布了
    @OnClose
    public void close(Session session){
        if(!session.isOpen()){
            //先查询session关注了哪个拍品
            map.forEach((key,value)->{
                if(value.contains(session)){
                    value.remove(session);
                };
            });
        }
        System.out.println(" 会话关闭了 ");
    }

    @OnMessage
    public void receivemsg(String msg, Session session){
        System.out.println(" 接收到了对方的消息 ");
    }

    // 发送最新价格
    public static void sendMsg(Integer aid, String hid, Integer nprice){
        //aid::hid::nprice
        String msg = aid + "::" + hid + "::" + nprice;
        //在map中寻找   aid 所对应的Session, 发最新价格
        List<Session> list = map.get(aid);
        list.forEach(session->{
            if(session.isOpen()){
                try {
                    session.getBasicRemote().sendText(msg);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        });

    }
}
